package Soligee.model.vo.cadastros;

import Soligee.model.vo.lancamentos.NFEntradaVO;
import Soligee.model.vo.lancamentos.OrcamentoVO;
import Soligee.model.vo.lancamentos.VendaVO;
import java.io.Serializable;
import java.util.Collection;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "produtos")
public class ProdutoVO implements Serializable {

    @Id
    @SequenceGenerator(name = "cod_produto", sequenceName = "cod_produto_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "cod_produto")
    @Column(name = "cod_produto", nullable = false)
    private int codProduto;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cod_categoria", insertable = true, updatable = true, nullable = false)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private CategoriaVO categoria;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cod_marca", insertable = true, updatable = true, nullable = false)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private MarcaVO marca;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "cod_sub_categoria", insertable = true, updatable = true, nullable = false)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.SAVE_UPDATE)
    private SubcategoriaVO subcategoria;

    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "itens_nfentrada",
    joinColumns = @JoinColumn(name = "cod_produto"),
    inverseJoinColumns = @JoinColumn(name = "cod_nf_entrada"))
    @Cascade(CascadeType.SAVE_UPDATE)
    private Collection<NFEntradaVO> nfentradas;

    @ManyToMany(fetch=FetchType.LAZY)
    @JoinTable(name="itensorcamento",
    joinColumns={@JoinColumn(name="cod_produto")},
    inverseJoinColumns={@JoinColumn(name="cod_orcamento")})
    @Cascade(CascadeType.SAVE_UPDATE)
    private Collection<OrcamentoVO> orcamentos;


    @ManyToMany(fetch = FetchType.LAZY)
    @JoinTable(name = "itens_venda",
    joinColumns = {@JoinColumn(name = "cod_produto")},
    inverseJoinColumns = {@JoinColumn(name = "cod_venda")})
    @Cascade(CascadeType.SAVE_UPDATE)
    private Collection<VendaVO> vendas;

    @Column(name = "descricao", nullable = false)
    private String descricao;

    @Column(name = "unidade", nullable = false)
    private String unidade;

    @Column(name = "qtdadestoque", nullable = false)
    private double qtdadeEstoque;

    @Column(name = "qtdade_min", nullable = false)
    private double qtdadeMinima;

    @Column(name = "preco_custo", nullable = false)
    private double precoCusto;

    @Column(name = "preco_venda", nullable = false)
    private double precoVenda;

    
    @Column(name = "percentual_venda", nullable = false)
    private double percentVenda;
    
    @Column (name="ativo", nullable = false)
    private boolean ativo;

    public ProdutoVO() {
    }

    public ProdutoVO(int codProduto, String descricao, String unidade, double qtdadeEstoque, double qtdadeMinima,
            double precoCusto, double precoVenda, 
            CategoriaVO categoria,
            SubcategoriaVO subcategoria, MarcaVO marca, double percentVenda) {

        this.setCodProduto(codProduto);
        this.setDescricao(descricao);
        this.setUnidade(unidade);
        this.setQtdadeEstoque(qtdadeEstoque);
        this.setQtdadeMinima(qtdadeMinima);
        this.setPrecoCusto(precoCusto);
        this.setPrecoVenda(precoVenda);        
        this.setSubcategoria(subcategoria);
        this.setCategoria(categoria);
        this.setMarca(marca);
        this.setPercentVenda(percentVenda);
        this.setAtivo(true);
    }

    public CategoriaVO getCategoria() {
        return categoria;
    }

    public void setCategoria(CategoriaVO categoria) {
        this.categoria = categoria;
    }

    public int getCodProduto() {
        return codProduto;
    }

    public void setCodProduto(int codProduto) {
        this.codProduto = codProduto;
    }

 

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public MarcaVO getMarca() {
        return marca;
    }

    public void setMarca(MarcaVO marca) {
        this.marca = marca;
    }

    public double getPrecoCusto() {
        return precoCusto;
    }

    public void setPrecoCusto(double precoCusto) {
        this.precoCusto = precoCusto;
    }

    public double getPrecoVenda() {
        return precoVenda;
    }

    public void setPrecoVenda(double precoVenda) {
        this.precoVenda = precoVenda;
    }

    public double getQtdadeEstoque() {
        return qtdadeEstoque;
    }

    public void setQtdadeEstoque(double qtdadeEstoque) {
        this.qtdadeEstoque = qtdadeEstoque;
    }

    public double getQtdadeMinima() {
        return qtdadeMinima;
    }

    public void setQtdadeMinima(double qtdadeMinima) {
        this.qtdadeMinima = qtdadeMinima;
    }

    public SubcategoriaVO getSubcategoria() {
        return getSubCategoria();
    }

    public void setSubcategoria(SubcategoriaVO subcategoria) {
        this.setSubCategoria(subcategoria);
    }

    public Collection<NFEntradaVO> getNfentradas() {
        return nfentradas;
    }

    public void setNfentradas(Collection<NFEntradaVO> nfentradas) {
        this.nfentradas = nfentradas;
    }

    public double getPercentVenda() {
        return percentVenda;
    }

    public void setPercentVenda(double percentualVenda) {
        this.percentVenda = percentualVenda;
    }

    public String getUnidade() {
        return unidade;
    }

    public void setUnidade(String unidade) {
        this.unidade = unidade;
    }

    public SubcategoriaVO getSubCategoria() {
        return subcategoria;
    }

    public void setSubCategoria(SubcategoriaVO subcategoria) {
        this.subcategoria = subcategoria;
    }

    public boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(boolean ativo) {
        this.ativo = ativo;
    }

    public Collection<OrcamentoVO> getOrcamento() {
        return orcamentos;
    }

    public void setOrcamento(Collection<OrcamentoVO> orcamento) {
        this.orcamentos = orcamento;
    }

    public Collection<OrcamentoVO> getOrcamentos() {
        return orcamentos;
    }

    public void setOrcamentos(Collection<OrcamentoVO> orcamentos) {
        this.orcamentos = orcamentos;
    }

    public Collection<VendaVO> getVendas() {
        return vendas;
    }

    public void setVendas(Collection<VendaVO> vendas) {
        this.vendas = vendas;
    }

}